import { withRetry } from './retry.js'

const ErrorType = {
  SYSTEM: 'SYSTEM',
  NETWORK: 'NETWORK',
  USER: 'USER',
  UNKNOWN: 'UNKNOWN'
}

const ErrorSeverity = {
  INFO: 'INFO',
  WARNING: 'WARNING',
  ERROR: 'ERROR',
  CRITICAL: 'CRITICAL'
}

class ErrorHandler {
  constructor() {
    this.retryableErrors = [
      '当前使用人数较多',
      'Too many requests',
      'Network timeout',
      'Connection refused'
    ]
  }

  /**
   * 处理错误
   * @param {Error} error 错误对象
   * @param {string} info 额外的错误信息
   */
  handleError(error, info) {
    console.log('Error occurred:', error)
    console.log('Additional info:', info)

    // 检查是否是可重试的错误
    if (this.isRetryableError(error)) {
      console.log('检测到可重试错误，将在后续请求中自动重试')
      return
    }

    // 根据错误类型进行不同处理
    if (error.name === 'NetworkError') {
      this.handleNetworkError(error)
    } else if (error.name === 'AuthenticationError') {
      this.handleAuthError(error)
    } else {
      this.handleGenericError(error)
    }
  }

  /**
   * 检查错误是否可重试
   * @param {Error} error 错误对象
   * @returns {boolean}
   */
  isRetryableError(error) {
    return this.retryableErrors.some(msg => 
      error.message?.toLowerCase().includes(msg.toLowerCase())
    )
  }

  /**
   * 处理网络错误
   * @param {Error} error 错误对象
   */
  handleNetworkError(error) {
    console.error('Network error:', error)
    // 这里可以添加网络错误的特殊处理逻辑
  }

  /**
   * 处理认证错误
   * @param {Error} error 错误对象
   */
  handleAuthError(error) {
    console.error('Authentication error:', error)
    // 这里可以添加认证错误的特殊处理逻辑，比如重定向到登录页
  }

  /**
   * 处理通用错误
   * @param {Error} error 错误对象
   */
  handleGenericError(error) {
    console.error('Generic error:', error)
    // 这里可以添加通用错误的处理逻辑
  }

  /**
   * 使用重试机制包装异步操作
   * @param {Function} operation 要执行的异步操作
   * @param {Object} options 重试配置选项
   */
  async withRetry(operation, options = {}) {
    return withRetry(operation, {
      ...options,
      shouldRetry: (error) => this.isRetryableError(error)
    })
  }
}

// 创建错误处理器实例
const errorHandler = new ErrorHandler()

// 统一导出所有内容
export {
  errorHandler as default,
  ErrorType,
  ErrorSeverity
}